// <![CDATA[

// contenedor de campos dependientes
var containnerId = "custom_fields_dependents";

// contenedor temporal que no se muestra
var containnerHideId="hide_div_custom_fields";

// calse para containnerId
var classContainner = "splitcontent";

// clase hijo de containnerId, a la izquierda
var classContainnerLeft = "splitcontentleft";

// clase hijo de containnerId, a la derecha
var classContainnerRight = "splitcontentright";

var customFieldIdPrefix = 'issue_custom_field_values_';

// bandera para saber si se ha inizializado ya el sistema combox y div
var inicilizado = false;


// clase por la que se identifica a los datapicker
var dataPickerClass = 'date_cf"';

/**
* Función que se lanza en el onload de la página. 
* Registra los eventos change de los select dependientes, oculta todos los campos
* que son dependientes y despues los muesra en una zona especial.
*/
function manage_fields_depedents() {

	var k = null;

	if (!inicilizado) {

		// para cada elemento condicionante
		for (k in managedCustomFieldDependentMap) {
			// creamos los div
			if (!inicilizado) {
				createDivStructure();
				inicilizado = true;
			}

			// le registramos la funcion onchange
			var idElemento = idSelectPrefix+k;
			if ($('#'+idElemento).length > 0) {

				$('#'+idElemento).live('change', function() { 
					changeDependientFields($(this));
				});

				// y ponemos sus campos condicionados
				changeDependientFields($('#'+idElemento));
			}
			
			
		}

	}
}

/**
* Crea la estructura de div donde se mostraran los campos dependientes.
*/
function createDivStructure() {

	// miramos que no lo hayamos creados ya
	if (! $('#'+containnerId).length >0) {
		// creamos la estructura de divs
		$("#attributes").append('<hr></hr><div id ="'+containnerId+'" class="'+classContainner+'"></div>');
		$("#"+containnerId).append('<div class="'+classContainnerLeft+'"></div>');
		$("#"+containnerId).append('<div class="'+classContainnerRight+'"></div>');

		$("#"+containnerId).after('<div id="'+containnerHideId+'" style="display:none;"></div>');
		$("#"+containnerId).after('<hr></hr>');
	}

}

/**
* Se activa al cambiar de valor un campo condicionante.
* Cuando se lanza, oculta/muestra los campos que dependen de él
* @param  $select elemento
*/
function changeDependientFields($select) {

	// accedemos a la lista de maps <valor:campos condicionados> de ese campo
	var idHtml = $select.attr('id');
	if (idHtml == undefined) {
		idHtml = $select.get(0)
	}

	if (idHtml != null) {

		// parseamos para obtener el sufijo del idhtml del elemento, que corresponde
		// al id del custom field
		var id = parseInt(idHtml.substring(customFieldIdPrefix.length,idHtml.length));

		if (id != null && id > 0) {

			// valores-campos condicionados para este
			var valueConditionedFields = managedCustomFieldDependentMap[id];

			// cogemos el valor del campo
			var selectedValue = $select.val();

			var currentValue = null;

			// iteramos por los distintos valores que habilitan campos
			for (currentValue in valueConditionedFields) {

				// ocultamos todos los casos menos el seleccionado
				if (currentValue != selectedValue) {

					// para el valor actual, cogemos el listado de campos condicionados
					conditionedFieldsArray = valueConditionedFields[currentValue];

					// cambiamos la visibilidad de los campos
					// en función de si se ha habilitado el elemento actual o no
					changeDependedFieldsByValue(conditionedFieldsArray,
											false);
				}

			}

			// nos aseguramos de que lo último que hacemos es mostrar
			// evitando que una dependencia posterior lo borre
			if (selectedValue != null
				&& valueConditionedFields != null
				&& valueConditionedFields != undefined) {

				conditionedFieldsArray = valueConditionedFields[selectedValue];
				changeDependedFieldsByValue(conditionedFieldsArray,
										true);
			}

		}
	} 
}

/**
* Oculta/muestra los campos condicionados.
* @param conditionedFieldsArray listado de campos condicionados
* @param show si vale true los muestra, si vale false los oculta
*/
function changeDependedFieldsByValue(conditionedFieldsArray, show) {

	var i = 0;
	// cogemos cada elemeto del array
	for (i in conditionedFieldsArray) {

		var customField = $('#'+idSelectPrefix+conditionedFieldsArray[i]);

		// si el elemento existe
		if (customField != null) { 

			// si la orden es mostrar, lo mostramos
			changeOrHideField(customField,show);

			// miramos si tiene dependencias transitivas
			// para realizar el proceso transitivamente
			changeDependientFields($('#'+idSelectPrefix+conditionedFieldsArray[i]));

		}
	}

}

/**
 * Habilita o deshabilita un campo en concreto.
 * @param customField campo jquery a mostrar/ocultar
 * @param show si vale true lo muestra, si vale false lo oculta
 */
function changeOrHideField(customField, show) {

	var parentCustomField = customField.parent();
	var isDataPicker = false;

	// problemas con los datapicker, antes de clonar, tenemos que eliminarlos
	if (customField.hasClass(dataPickerClass)) {
		customField.datepicker('destroy');
		isDataPicker = true;	
	}
	
	if (show) {

		// para mostrarlo elegimos la columna, que será la que tenga menos elementos
		// o la izquierda en caso de igualdad
		var collumna = null;
		
		var numElementsLeft = $("#"+containnerId+" > div."+classContainnerLeft).children().length;
		var numElementsRight = $("#"+containnerId+" > div."+classContainnerRight).children().length;

		if (numElementsLeft <= numElementsRight) {
			columna = classContainnerLeft;
		} else {
			columna = classContainnerRight;
		}
		
		// añadimos a la columna elegida
		$("#"+containnerId+" > div."+columna).append(parentCustomField.clone());

		// borramos del contenedor oculto
		parentCustomField.remove();


	} else {

		// le quitamos el valor
		customField.val(null);

		// clonamos el elemento al contenedor oculto
		$("#"+containnerHideId).append(parentCustomField.clone());

		// eliminamos el original
		parentCustomField.remove();
	}

	// miramos si tiene clase datapicker
	if(isDataPicker) {
		// en cuyo caso le ponemos el datapicker
		$('#'+idSelectPrefix+conditionedFieldsArray[i]).datepicker(datepickerOptions);
	}

}

// se encarga de que se llame el método manage_fields_depedents cuando se carga la página.
// hay dos posibilidades en función de los que acepte el navegador,
// como puede darse las dos posibilidades, usamos una bandera para saber si ya 
// se ha lanzado

$( document ).ready(function() {
    manage_fields_depedents();
});

$( window ).load(function() {
    manage_fields_depedents();
});


//]]>